This RMD imports data to generate figures for Natasha Ryan’s undergraduate honours thesis at Mount Allison University.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Methods

Fc_data <- readRDS("../Data/CleanData/LOW_Fragilariopsis_cylindrus_SolFitsTrim.Rds") %>%
  mutate(SState = ifelse(SState == 4, 0, SState))

s.col <- c("#003D4F","#375D97","#3397A6","#9FD4C2")

Fc_data %>%
  filter(Filename == "20230926_SeGu1001_0C_1s") %>%
  filter(Flashnumber <= 13) %>%
  ggplot() +
  geom_point(aes(x=Flashnumber, y=FvFmrunnorm, col=as.factor(SState))) +
  scale_color_manual(values = s.col) +
  #scale_y_continuous(limits=c(0.5, 1.1)) +
  scale_x_continuous(breaks=c(4,8,12))+
  labs(x= "Flash Number", y= "Normalized Chlorophyll Fluorescence") +
  theme_bw() +
  theme(legend.position = "none", text = element_text(family = "Palatino"), 
        axis.text=element_text(size=16), axis.title=element_text(size=14.8),
        panel.grid.major = element_blank(), panel.grid.minor = element_blank())

Results

Representative Fluorescence Oscillations

Fc_data %>%
  filter(CultureID == "SeGu1001", 
         Temp_C %in% c(0,10), 
         ObsDate == "2023-09-27",
         PulseSpace_s %in% c(1,4,16)) %>%
  ggplot() +
  geom_point(aes(x=Flashnumber, y=FvFmrunnorm, col=as.factor(SState))) +
  scale_color_manual(values = s.col) +
  labs(x= "Flash Number", y= "Normalized Chlorophyll Fluorescence", col= "Majority S-State") +
  facet_grid(rows=vars(PulseSpace_s), cols=vars(Temp_C)) +
  scale_y_continuous(sec.axis=sec_axis(~ . , name = sym("Flash Spacing (s)"),breaks = NULL,labels = NULL)) +
  scale_x_continuous(breaks=c(4,8,12,16,20,24,28,32),
       sec.axis=sec_axis(~ . , name = sym("Measurement Temperature (°C)"), breaks = NULL, labels = NULL)) +
  theme_bw() +
  theme(text = element_text(family = "Times New Roman"), 
        axis.text=element_text(size=11), axis.title=element_text(size=13),
        legend.text=element_text(size=11), legend.title=element_text(size=13),
        strip.background = element_rect(colour="black", fill=NA),
        strip.text = element_text(size=11), 
        panel.grid.major = element_blank(), panel.grid.minor = element_blank())

 # ggsave("representativeoscillations.png", width = 8, height = 5, dpi = 900,
 #       plot=last_plot(),
 #       path="../Output")

FFT

Wavelet Power

wavelets <- readRDS("../Data/ProcessedData/LOW_Wavelets.Rds") 
specieslists <- split(wavelets, sub("_.*", "_wavelets", names(wavelets)))
list2env(specieslists, envir = .GlobalEnv)
## <environment: R_GlobalEnv>
plot.wt.grid <- function(wavelets) {
  result_list <- lapply(names(wavelets), function(condition_name) {
    condition <- wavelets[[condition_name]]
    Power.avg <- condition$Power.avg
    Power.avg.pval <- condition$Power.avg.pval
    Period <- condition$Period
    Condition <- rep(condition_name, length(Power.avg))  # Repeat condition name for each row
    df <- data.frame(Power.avg, Power.avg.pval, Period, Condition) %>%
      separate(Condition, into = c("Strain", "PulseSpace_s", "Temp_C", "LightLevel"), sep = "_") %>%
      mutate(PulseSpace_s = factor(PulseSpace_s, levels = c("1","2","4","8","16")),
             Temp_C = factor(Temp_C, levels = 
                               c("0","2","4","6","8","10","12","14","16","18","20","22","24","26","28"))) %>%
      mutate(Power.avg.pval = ifelse(Power.avg.pval <= 0.05, 0, 1))
    
     return(df)
  })

  result_df <- bind_rows(result_list)  # Combine all data frames and add a column for element names
  
  plot <- result_df %>%
    ggplot()+ 
    geom_path(aes(x= Power.avg, y= Period, col=Power.avg.pval), linewidth=0.8) +
    scale_color_gradient(low="#4AC0AD", high="black", breaks= c(0.05, 1), 
                         labels= c("≤ 0.05", "> 0.05"), guide="legend") +
    labs(x= "Average Wavelet Power", colour= "P-Value") +
    facet_grid(rows=vars(PulseSpace_s), cols = vars(Temp_C)) +
    scale_y_continuous(sec.axis=sec_axis(~ . , name = sym("Flash Spacing (s)"),
                                         breaks = NULL,labels = NULL)) +
    scale_x_continuous(limits= c(0:1), breaks=c(0, 0.5, 1), 
        sec.axis=sec_axis(~ . , name = sym("Measurement Temperature (°C)"), breaks = NULL, labels = NULL)) +
    theme_bw() +
    theme(text = element_text(family = "Times New Roman"), 
        axis.text=element_text(size=11), axis.title=element_text(size=13),
        legend.text=element_text(size=11), legend.title=element_text(size=13),
        strip.background = element_rect(colour="black", fill=NA),
        strip.text = element_text(size=11), 
        panel.grid.major = element_blank(), panel.grid.minor = element_blank())
    
  return(plot)
}
plot.wt.grid(Ci_wavelets)

plot.wt.grid(Cm_wavelets)

plot.wt.grid(Cp_wavelets)

plot.wt.grid(Cr_wavelets)

plot.wt.grid(Cv_wavelets)

plot.wt.grid(Tp_wavelets)

Damping Across Taxa

sstate_damping <- readRDS("~/LowLightPhotosynth/Data/ProcessedData/LOW_SState_Damping.Rds") %>%
  mutate(Strain = factor(Strain))

split.sstate <- split(sstate_damping, sstate_damping$Strain)
names(split.sstate) <- c("Ci.damping", "Cm.damping", "Cp.damping", "Cr.damping", 
                         "Cv.damping", "Fc.damping", "Tp.damping")
list2env(split.sstate, envir = .GlobalEnv)
## <environment: R_GlobalEnv>
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(reshape2)
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
library(orca)
library(processx)
Cv.loess <- loess(DampingIndex ~ TempDiff_C * Light_Level, data = Cv.damping)

Cv.data <- with(Cv.damping, expand.grid(
  Light_Level = seq(min(Light_Level), max(Light_Level), 0.1),
  TempDiff_C = seq(min(TempDiff_C), max(TempDiff_C), 0.1)
))

Cv_mtrx3d <- predict(Cv.loess, newdata = Cv.data)

Cv_mtrx_melt <- reshape2::melt(Cv_mtrx3d, id.vars = c('TempDiff_C', 'Light_Level'), measure.vars = 'DampingIndex') %>%
  mutate(TempDiff_C = as.numeric(str_sub(TempDiff_C, str_locate(TempDiff_C, '=')[1,1] + 1)),
         Light_Level = as.numeric(str_sub(Light_Level, str_locate(Light_Level, '=')[1,1] + 1))) %>%
  dplyr::rename("DampingIndex" = "value") %>%
  mutate(DampingIndex = ifelse(DampingIndex < 0, 0, DampingIndex))
         
  
Cv.plot <- plot_ly(Cv_mtrx_melt, x = ~TempDiff_C, y = ~Light_Level, z = ~DampingIndex, type = "contour",
                   autocontour = TRUE, contours = list(coloring = 'heatmap', showlabels= TRUE), 
                   line = list(smoothing = 0.9)) %>%
  colorbar(title = "Damping Index", size = 12) %>%
  config(staticPlot = TRUE) %>%
  layout(
     font = list(family = "Times New Roman", size = 13),
     xaxis = list(title = "Deviation from Growth Temperature (°C)", 
                  tickvals=c(-12, -8, -4, 0, 4), fixedrange = TRUE),
     yaxis = list(title = "Light Level (µmol photons m<sup>-2</sup> s<sup>-1</sup>)",
                  fixedrange = TRUE)) %>%
  config(responsive =FALSE)


#orca(Cv.plot, file = "../Output/Cv.plot.png")
Cv.plot